/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estsapp.controladores.AMBProductoStandar;

import estsapp.controladores.Controlador;
import estsapp.controladores.ControladorPrincipal;
import estsapp.controladores.FabricaControladores;
import estsapp.entidades.ProductoStandar;
import estsapp.entidades.ProductoTerminado;
import estsapp.expertos.ExpertoABMProductoTerminado;
import estsapp.expertos.ExpertoCostosYProductoStandar;
import estsapp.expertos.FabricaExpertos;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.Conexion;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ControladorABMProductoEstandar implements Controlador {

    PantallaABMProductoStandar pantalla;
    ExpertoCostosYProductoStandar experto;
    ExpertoABMProductoTerminado expertoProductoTerminado;
    ProductoStandar productoStandar;
    ProductoTerminado productoTerminado;
    ModeloTablaProductosEstandar modeloTablaMaquinaria = new ModeloTablaProductosEstandar();
    private boolean iniciado = false;

    public ControladorABMProductoEstandar() {
        pantalla = new PantallaABMProductoStandar();
        experto = (ExpertoCostosYProductoStandar) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PRODUCTO_ESTANDAR);
        expertoProductoTerminado = (ExpertoABMProductoTerminado) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PRODUCTO_TERMINADO);
        
        if (!experto.buscarProductosStandarVigente().isEmpty()) {
            productoStandar = ((ProductoStandar)experto.buscarProductosStandarVigente().get(0));
            pantalla.getTextoProductoEstandarActual().setText(productoStandar.getProductoStandar().getNombre());
        }
        
        agregarListenerABotones();

        if (productoStandar != null) {
//            actualizarPuntoDeEquilibrioEstandar();
        }

    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        } else {
            pantalla.setVisible(true);
        }
        pantalla.getTablaProductos().setModel(new ModeloTablaProductosEstandar());
        ((ModeloTablaProductosEstandar) pantalla.getTablaProductos().getModel()).setListaElementos(expertoProductoTerminado.buscarProductosTerminados());

    }

    public void agregarListenerABotones() {
        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantalla.setVisible(false);
            }
        });
        pantalla.getBtnSeleccionarProductoEstandar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarProductoStandar();
            }
        });


        pantalla.getTablaProductos().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarProducto();
            }
        });
        
        
        pantalla.getTablaProductos().addMouseListener(new MouseAdapter() {

            int filaSeleccionada = -1;

            @Override
            public void mousePressed(MouseEvent e) {

                int indiceModelo = pantalla.getTablaProductos().convertRowIndexToModel(pantalla.getTablaProductos().rowAtPoint(e.getPoint()));
                int fila = pantalla.getTablaProductos().rowAtPoint(e.getPoint());
                if (fila > -1) {
                    filaSeleccionada = fila;
                    productoTerminado = (ProductoTerminado) ((((ModeloTablaProductosEstandar) pantalla.getTablaProductos().getModel()).getListaElementos().get(fila)));

                }
            }
        });

    }

    public void seleccionarProducto() {
        int fila = pantalla.getTablaProductos().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTablaProductos().convertRowIndexToModel(fila);
        productoTerminado = (ProductoTerminado) ((ModeloTablaProductosEstandar) pantalla.getTablaProductos().getModel()).getRow(filaModelo);

    }

 public void actualizarNuevoProductoEstandar(){
     pantalla.getTextoProductoEstandarActual().setText(productoStandar.getProductoStandar().getNombre());
     pantalla.getTablaProductos().setModel(new ModeloTablaProductosEstandar());
     ((ModeloTablaProductosEstandar)pantalla.getTablaProductos().getModel()).setListaElementos(expertoProductoTerminado.buscarProductosTerminados());
 }

    public void seleccionarProductoStandar() {
        if (productoTerminado == null) {
            JOptionPane.showMessageDialog(null, "Seleccione un producto");
        } else {

                productoStandar = new ProductoStandar();

                productoStandar.setProductoStandar(productoTerminado);
                productoStandar.setVigente(true);
                try {
                    Conexion.getInstancia().iniciarTX();
                    experto.nuevoProductoStandar(productoStandar);
                    Conexion.getInstancia().confirmarTx();
                    JOptionPane.showMessageDialog(null, "Nuevo producto estandar asignado");
                    actualizarNuevoProductoEstandar();
                } catch (ExcepcionFachada ex) {
                    Conexion.getInstancia().deshacerTx();
                }
            

        }

    }

    private void actualizarPuntoDeEquilibrioEstandar() {
        try {
            throw  new Exception("error");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
    }


}
